// ---------------------------------------
// Template: cls.cs	rel: 3.0.0.0 NoDal
// ---------------------------------------
using System;
using System.Data;
using IGCal.Collections;
using IGCal.Funzioni;
using IGCal.DB;

namespace Calcio.StampaDistinta
{
	/// <summary>
	/// Middle tier per accedere alla tabella Dirigenti
	/// </summary>
	public class DirigenteCollection : IGCalDictionaryBase
	{

		/// <summary>
		/// Crea una nuova istanza della collection
		/// </summary>
		public DirigenteCollection()
		{
		}

		/// <summary>
		/// Recupera Dirigente dalla collection
		/// </summary>
		public Dirigente this[int ID]
		{
			get
			{
				Dirigente Dirigente = new Dirigente();
				
				Dirigente.SetID(ID);
				
				
				Dirigente = (Dirigente) InnerHashtable[Dirigente];

				return Dirigente;
			}
		}

		/// <summary>
		/// Rigenera la collection leggendo dalla tabella Dirigenti
		/// </summary>
		/// <param name="connection">Connessione al database da cui leggere</param>
		/// <param name="sqlWhere">Clausola where da utilizzare nella query (null o "" per leggere tutti i record)</param>
		public void Refresh(Connection connection, string sqlWhere)
		{
			InnerHashtable.Clear();

			DataTable dataTable;
			Dirigente Dirigente;

			string sql = GetQuery(sqlWhere);

			dataTable = connection.GetDataTable(sql);

			foreach (DataRow row in dataTable.Rows)
			{
				Dirigente = new Dirigente();
				Dirigente.ReadFromRow(row);
				InnerHashtable.Add(Dirigente, Dirigente);
			}
		}

		/// <summary>
		/// Recupera Dirigente dalla tabella Dirigenti
		/// </summary>
		/// <param name="connection">Connessione al database da cui leggere</param>
		/// <param name="ID">ID</param>
		/// <returns>Dirigente</returns>
		public static Dirigente Read(Connection connection, int ID)
		{
			Dirigente Dirigente;

			DataRow row;

			try
			{
				row = GetRecord(connection, null, ID);
			}
			catch
			{
				return null;
			}

			Dirigente = new Dirigente();
			Dirigente.ReadFromRow(row);
			return Dirigente;
		}

		/// <summary>
		/// Inserisce l'elemento nella tabella
		/// </summary>
		/// <param name="connection">Connessione</param>
		/// <param name="Dirigente">Elemento da inserire nella tabella</param>
		public static void Insert(Connection connection, Dirigente Dirigente)
		{
			string SQL = GetQuery("1 = 2");
			DataAdapter dataAdapter = connection.GetDataAdapter();
			DataTable dataTable = connection.GetDataTable(dataAdapter, SQL);

			DataRow row = dataTable.NewRow();
			Dirigente.WriteToRow(row);
			dataTable.Rows.Add(row);

			dataAdapter.Update(dataTable);

			Dirigente.SetID(connection.GetLatestIDEntity(dataAdapter));
			dataAdapter.Dispose();
		}

		/// <summary>
		/// Aggiorna l'elemento nella tabella. Con questo metodo non � possibile aggiornare la primary key
		/// </summary>
		/// <param name="connection">Connessione</param>
		/// <param name="Dirigente">Elemento da aggiornare nella tabella</param>
		public static void Update(Connection connection, Dirigente Dirigente)
		{
			Update(connection, Dirigente.ID, Dirigente);
		}

		/// <summary>
		/// Aggiorna l'elemento identificato con i campi chiave specificati nella tabella
		/// </summary>
		/// <param name="connection">Connessione</param>
		/// <param name="ID">ID</param>
		/// <param name="Dirigente">Elemento da aggiornare nella tabella</param>
		public static void Update(Connection connection, int ID, Dirigente Dirigente)
		{
			DataAdapter dataAdapter = connection.GetDataAdapter();

			DataRow row = GetRecord(connection, dataAdapter, ID);
			Dirigente.WriteToRow(row);

			dataAdapter.Update(row.Table);

			dataAdapter.Dispose();
		}

		/// <summary>
		/// Elimina l'elemento dalla tabella
		/// </summary>
		/// <param name="connection">Connessione</param>
		/// <param name="Dirigente">Elemento da eliminare dalla tabella</param>
		public static void Delete(Connection connection, Dirigente Dirigente)
		{
			Delete(connection, Dirigente.ID);
		}

		/// <summary>
		/// Elimina l'elemento nella tabella
		/// </summary>
		/// <param name="connection">Connessione</param>
		/// <param name="ID">ID</param>
		public static void Delete(Connection connection, int ID)
		{
			DataAdapter dataAdapter = connection.GetDataAdapter();

			DataRow row = GetRecord(connection, dataAdapter, ID);

			row.Delete();

			dataAdapter.Update(row.Table);

			dataAdapter.Dispose();
		}

		/// <summary>
		/// Costruisce la query sulla tabella
		/// </summary>
		/// <param name="SQLWhere">Clausola where da utilizzare nella query (null o string.Empty per leggere tutti i record)</param>
		/// <returns>La query</returns>
		private static string GetQuery(string SQLWhere)
		{
			if (SQLWhere == null || SQLWhere == string.Empty)
				return "Select * From Dirigenti";
			else
				return "Select * From Dirigenti Where " + SQLWhere;
		}

		/// <summary>
		/// Recupera un record dalla tabella (se non c'e' o ce ne sono piu' di uno viene rilanciata un'eccezione)
		/// </summary>
		/// <param name="connection">Connessione</param>
		/// <param name="dataAdapter">DataAdapter nel caso in cui la tabella debba essere aperta in scrittura</param>
		/// <param name="ID">ID</param>
		/// <returns>La DataRow relativa al record</returns>
		private static DataRow GetRecord(Connection connection, DataAdapter dataAdapter, int ID)
		{
			string SQLWhere = null;
			DataTable dataTable;

			SQLWhere += string.Format(" And ID = {0}", ID);

			string SQL = GetQuery(SQLWhere.Substring(4));

			if (dataAdapter != null)
				dataTable = connection.GetDataTable(dataAdapter, SQL);
			else
				dataTable = connection.GetDataTable(SQL);

			if (dataTable.Rows.Count == 0)
				throw new Exception("Record non trovato");

			if (dataTable.Rows.Count > 1)
				throw new Exception("La chiave primaria non identifica solo un record");

			return dataTable.Rows[0];
		}
	}







	/// <summary>
	/// Middle tier per accedere ad un record della tabella Dirigenti
	/// </summary>
	public class Dirigente
	{
		private int _ID;
		private string _Cognome;
		private string _Nome;
		private int _RuoloSocietario;
		private string _Stagione;
		private string _TipoDocumento2;
		private string _CodiceDocumento2;
		private string _ProvenienzaDocumento2;
		private string _TipoDocumento3;
		private string _CodiceDOcumento3;
		private string _ProvenienzaDocumento3;
		private string _TipoDocumento1;
		private string _CodiceDocumento1;
		private string _ProvenienzaDocumento1;

		/// <summary>
		/// Crea una nuova istanza della classe
		/// </summary>
		public Dirigente()
		{
		}

		/// <summary>
		/// Legge le propriet� della classe dalla row
		/// </summary>
		/// <param name="row">Row da leggere</param>
		public void ReadFromRow(DataRow row)
		{
			_ID = General.DBToInt(row["ID"]);
			_Cognome = General.DBToString(row["Cognome"]);
			_Nome = General.DBToString(row["Nome"]);
			_RuoloSocietario = General.DBToInt(row["RuoloSocietario"]);
			_Stagione = General.DBToString(row["Stagione"]);
			_TipoDocumento2 = General.DBToString(row["TipoDocumento2"]);
			_CodiceDocumento2 = General.DBToString(row["CodiceDocumento2"]);
			_ProvenienzaDocumento2 = General.DBToString(row["ProvenienzaDocumento2"]);
			_TipoDocumento3 = General.DBToString(row["TipoDocumento3"]);
			_CodiceDOcumento3 = General.DBToString(row["CodiceDOcumento3"]);
			_ProvenienzaDocumento3 = General.DBToString(row["ProvenienzaDocumento3"]);
			_TipoDocumento1 = General.DBToString(row["TipoDocumento1"]);
			_CodiceDocumento1 = General.DBToString(row["CodiceDocumento1"]);
			_ProvenienzaDocumento1 = General.DBToString(row["ProvenienzaDocumento1"]);
		}

		/// <summary>
		/// Scrive le propriet� della classe nella row
		/// </summary>
		/// <param name="row">Row da scrivere</param>
		public void WriteToRow(DataRow row)
		{
			row["Cognome"] = General.StringToDB(_Cognome);
			row["Nome"] = General.StringToDB(_Nome);
			row["RuoloSocietario"] = General.IntToDB(_RuoloSocietario);
			row["Stagione"] = General.StringToDB(_Stagione);
			row["TipoDocumento2"] = General.StringToDB(_TipoDocumento2);
			row["CodiceDocumento2"] = General.StringToDB(_CodiceDocumento2);
			row["ProvenienzaDocumento2"] = General.StringToDB(_ProvenienzaDocumento2);
			row["TipoDocumento3"] = General.StringToDB(_TipoDocumento3);
			row["CodiceDOcumento3"] = General.StringToDB(_CodiceDOcumento3);
			row["ProvenienzaDocumento3"] = General.StringToDB(_ProvenienzaDocumento3);
			row["TipoDocumento1"] = General.StringToDB(_TipoDocumento1);
			row["CodiceDocumento1"] = General.StringToDB(_CodiceDocumento1);
			row["ProvenienzaDocumento1"] = General.StringToDB(_ProvenienzaDocumento1);
		}

		/// <summary>
		/// Legge/Imposta ID
		/// </summary>
		public int ID
		{
			get
			{
				return _ID;
			}

		}

		/// <summary>
		/// Imposta ID
		/// </summary>
		/// <param name="ID">nuovo valore diID</param>
		internal void SetID(int ID)
		{
			_ID = ID;
		}

		/// <summary>
		/// Legge/Imposta Cognome
		/// </summary>
		public string Cognome
		{
			get
			{
				return _Cognome;
			}

			set
			{
				_Cognome = value;
			}
		}
		/// <summary>
		/// Legge/Imposta Nome
		/// </summary>
		public string Nome
		{
			get
			{
				return _Nome;
			}

			set
			{
				_Nome = value;
			}
		}
		/// <summary>
		/// Legge/Imposta RuoloSocietario
		/// </summary>
		public int RuoloSocietario
		{
			get
			{
				return _RuoloSocietario;
			}

			set
			{
				_RuoloSocietario = value;
			}
		}
		/// <summary>
		/// Legge/Imposta Stagione
		/// </summary>
		public string Stagione
		{
			get
			{
				return _Stagione;
			}

			set
			{
				_Stagione = value;
			}
		}
		/// <summary>
		/// Legge/Imposta TipoDocumento2
		/// </summary>
		public string TipoDocumento2
		{
			get
			{
				return _TipoDocumento2;
			}

			set
			{
				_TipoDocumento2 = value;
			}
		}
		/// <summary>
		/// Legge/Imposta CodiceDocumento2
		/// </summary>
		public string CodiceDocumento2
		{
			get
			{
				return _CodiceDocumento2;
			}

			set
			{
				_CodiceDocumento2 = value;
			}
		}
		/// <summary>
		/// Legge/Imposta ProvenienzaDocumento2
		/// </summary>
		public string ProvenienzaDocumento2
		{
			get
			{
				return _ProvenienzaDocumento2;
			}

			set
			{
				_ProvenienzaDocumento2 = value;
			}
		}
		/// <summary>
		/// Legge/Imposta TipoDocumento3
		/// </summary>
		public string TipoDocumento3
		{
			get
			{
				return _TipoDocumento3;
			}

			set
			{
				_TipoDocumento3 = value;
			}
		}
		/// <summary>
		/// Legge/Imposta CodiceDOcumento3
		/// </summary>
		public string CodiceDOcumento3
		{
			get
			{
				return _CodiceDOcumento3;
			}

			set
			{
				_CodiceDOcumento3 = value;
			}
		}
		/// <summary>
		/// Legge/Imposta ProvenienzaDocumento3
		/// </summary>
		public string ProvenienzaDocumento3
		{
			get
			{
				return _ProvenienzaDocumento3;
			}

			set
			{
				_ProvenienzaDocumento3 = value;
			}
		}
		/// <summary>
		/// Legge/Imposta TipoDocumento1
		/// </summary>
		public string TipoDocumento1
		{
			get
			{
				return _TipoDocumento1;
			}

			set
			{
				_TipoDocumento1 = value;
			}
		}
		/// <summary>
		/// Legge/Imposta CodiceDocumento1
		/// </summary>
		public string CodiceDocumento1
		{
			get
			{
				return _CodiceDocumento1;
			}

			set
			{
				_CodiceDocumento1 = value;
			}
		}
		/// <summary>
		/// Legge/Imposta ProvenienzaDocumento1
		/// </summary>
		public string ProvenienzaDocumento1
		{
			get
			{
				return _ProvenienzaDocumento1;
			}

			set
			{
				_ProvenienzaDocumento1 = value;
			}
		}
		/// <summary>
		/// Recupera l'hash code
		/// </summary>
		/// <param name="ID">ID</param>
		/// <returns>L'hash code</returns>
		public static int GetHashCode(int ID)
		{
			int hash = ID.GetHashCode();

			return hash;
		}


		/// <summary>
		/// Confronta gli elementi
		/// </summary>
		/// <param name="a">Primo elemento</param>
		/// <param name="b">Secondo elemento</param>
		/// <returns>true se gli elementi sono uguali altrimenti false</returns>
		public static bool operator == (Dirigente a, Dirigente b)
		{
			if (object.Equals(a, null))
				return (object.Equals(b, null));
			else if (object.Equals(b, null))
				return false;
			else
				return (a._ID == b._ID);
		}

		/// <summary>
		/// Confronta gli elementi
		/// </summary>
		/// <param name="a">Primo elemento</param>
		/// <param name="b">Secondo elemento</param>
		/// <returns>true se gli elementi sono diversi altrimenti false</returns>
		public static bool operator != (Dirigente a, Dirigente b)
		{
			if (object.Equals(a, null))
				return (!object.Equals(b, null));
			else if (object.Equals(b, null))
				return true;
			else
				return !(a._ID == b._ID);
		}

		/// <summary>
		/// Confronta l'elemento corrente con l'elemento specificato
		/// </summary>
		/// <param name="obj">Oggetto da confrontare</param>
		/// <returns>true se gli elementi sono uguali altrimenti false</returns>
		public override bool Equals(object obj)
		{
			if (obj is Dirigente)
			{
				Dirigente Dirigente = (Dirigente) obj;
				return (Dirigente._ID == this._ID);
			}

			return base.Equals(obj);
		}

		/// <summary>
		/// Recupera l'hash code
		/// </summary>
		/// <returns>L'hash code</returns>
		public override int GetHashCode()
		{
			return GetHashCode(_ID);
		}
	}
}

